package com.jwsoft.manager.core.integration.eduAddressTree;

import com.bifang.assistant.common.vo.BasePageVO;
import com.bifang.assistant.common.vo.BaseVO;
import com.bifang.module.base.common.vo.tree.TreeVO;
import com.github.pagehelper.PageInfo;
import com.jwsoft.manager.common.vo.address.AddressSchoolVO;
import com.jwsoft.manager.common.vo.address.AddressTreeSchoolVO;
import com.jwsoft.manager.common.vo.addressParse.AddressInfo;
import com.jwsoft.manager.common.vo.eduAddressTree.*;
import com.jwsoft.manager.common.vo.eduAddressTreeInitial.EduAddressTreeInitialQueryVO;
import com.jwsoft.manager.common.vo.eduAddressTreeSchool.EduAddressSchoolRelationAddVO;
import com.jwsoft.manager.common.vo.eduAddressTreeSchool.EduAddressTreeSchoolQueryVO;
import com.jwsoft.manager.common.vo.eduAddressTreeSchool.EduAddressTreeSchoolRemoveVO;
import com.jwsoft.manager.common.vo.eduAddressTreeSchool.EduAddressTreeSchoolVO;
import com.jwsoft.manager.common.vo.eduSchool.EduSchoolVO;
import com.jwsoft.manager.core.dao.model.EduAddress;
import com.jwsoft.manager.core.dao.model.EduAddressTree;
import com.jwsoft.manager.core.integration.eduAddressTree.impl.AddressInfoAndSchool;

import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;

/**
 * 业务类
 *
 * @author fangs
 * @since 2023-01-12
 */
public interface EduAddressTreeIntegration {

    /**
     * 初始化ES地址数据
     *
     * @param vo 传token用，用于登录权限校验
     * @author fangs
     */
    void initAddressTreeEs(BaseVO vo);

    /**
     * 格式地址化，失败时自动加默认前缀重试
     *
     * @param addressReqVO 需要格式话的地址
     * @return 格式化后的地址
     * @author fangs
     */
    AddressVO parseAddressAuto(AddressReqVO addressReqVO);

    /**
     * 格式地址化，失败时自动加默认前缀重试并保存
     *
     * @param addressRequest 需要格式话的地址
     * @return 格式化后的地址
     * @author fangs
     */
    AddressVO parseAddressAutoAndSave(AddressRequest addressRequest);

    /**
     * 根据parentId获取下级节点
     *
     * @param addressTreeReqVO 查询请求参数
     * @return 地址树节点
     * @author fangs
     */
    PageInfo<AddressTreeVO> getListByParentId(AddressTreeReqVO addressTreeReqVO);

    /**
     * 获取地址树节点绑定的学校
     *
     * @param treeSchoolQueryVO 地址树id和学校筛选参数
     * @return 绑定的学校列表
     * @author fangs
     */
    PageInfo<EduAddressTreeSchoolVO> getSchool(EduAddressTreeSchoolQueryVO treeSchoolQueryVO);


    /**
     * 地址树节点移动
     *
     * @param moveNodeReqVO 移动参数
     * @author fangs
     */
    void moveTreeNode(MoveNodeReqVO moveNodeReqVO);

    /**
     * 根据用户获取乡镇街道
     *
     */
    List<TreeVO> getTownTreeByUser(BaseVO vo);

    /**
     * 根据主键获取地址详细信息
     * @param vo addressId
     * @return
     */
    EduAddressTreeInfoVO queryAddressInfoById(AddressTreeQueryVO vo);


    /**
     * 批量删除地址树关联学校信息
     * @param vo
     */
    void removeSchoolRelation(EduAddressTreeSchoolRemoveVO vo);

    /**
     * 查询地址能关联的学校信息
     * @param vo
     */
    PageInfo<EduSchoolVO> querySchoolRelation(EduAddressTreeSchoolQueryVO vo);

    /**
     * 添加学校关联信息
     * @param vo
     */
    void addSchoolRelation(EduAddressSchoolRelationAddVO vo);

    /**
     * 保存地址树节点详细信息
     * @param vo
     */
    void saveAddressTreeInfo(EduAddressTreeInfoVO vo);

    void lockDescendants(EduAddressTreeVO eduAddressTreeVO, List<String> schoolList, List<EduAddressTree> treeLinks, String checkPrimary, String checkMiddle);

    /**
     * 地址树节点新增
     *
     * @param vo
     * @return 新增后的节点
     */
    EduAddressTreeVO addAddressTreeNode(EduAddressTreeInfoVO vo);

    /**
     * 根据主键删除地址树节点
     *
     * @param vo 需要删除的节点id
     */
    void deleteByAddressId(EduAddressTreeKeyVO vo);

    /**
     * 从多个节点名字中抽取共同字段为新的父节点
     *
     * @param vo 待合并的对象
     * @return 合并完成的节点
     * @author fangs
     * @see com.jwsoft.manager.core.dao.service.EduAddressTreeService#mergeNodeAndCreateParent(List)
     */
    AddressTreeVO mergeNodeAndCreParent(AddressTreeMergeVO vo);


    /**
     * 根据主键修改叶子节点
     *
     * @param vo
     */
    void editLeafNodeByAddressId(EduAddressTreeKeyVO vo);

    /**
     * 将多个节点合并
     *
     * @param vo 待合并的数据
     * @return 合并后的结果
     * @author fangs
     */
    AddressTreeVO mergeNode(AddressTreeMergeVO vo);


    /**
     * 地址识别并匹配学区
     *
     * @param addressReqVO 地址信息
     * @return 地址和学区信息
     * @author fangs
     */
    AddressAndSchoolVO parseAddressAndMatchSchool(AddressReqVO addressReqVO);

    /**
     * 节点合并应用接口，将合并树节点的数据修改在数据库执行
     *
     * @param addressTreeApplyVO 节点合并请求参数
     * @return 应用前id和应用后id的映射关系
     * @author fangs
     */
    Map<Long, Long> applyMarge(AddressTreeApplyVO addressTreeApplyVO);


    /**
     * 分页获取学校账号的树节点信息
     *
     * @return
     */
    PageInfo<AddressTreeForSchoolVO> getSchoolAddressTree(AddressTreeSchoolVO vo);

    /**
     * 学校用户关联树节点接口
     *
     * @param vo
     */
    void schoolRelationAddress(AddressSchoolVO vo);

    /**
     * 地址树节点es同步-单节点同步
     *
     * @param vo 同步参数
     * @author fangs
     */
    void syncAddressTreeEs(AddressTreeSyncVO vo);

    /**
     * 将地址节点转换为地址信息
     *
     * @param addressTreeVO 当前节点
     * @return 地址信息
     * @author fangs
     */
    AddressVO nodeToAddressVO(AddressTreeVO addressTreeVO);

    /**
     * 开始统计叶子节点数量
     *
     * @param eduAddressTreeVO 地址树节点
     * @author fangs
     */
    void startEvaluateLeafNum(EduAddressTreeVO eduAddressTreeVO);

    /**
     * 检查叶子节点数量是否统计完成
     *
     * @param baseVO token
     * @return 是否完成统计，true-完成，false-未完成
     * @author fangs
     */
    Boolean isFinishEvaluateLeafNum(BaseVO baseVO);

    /**
     * 根据节点id删除，被删除节点的子节点也会被删除
     *
     * @param keyVO 需要删除的节点id集合
     * @author fangs
     */
    void removeBatchById(AddressTreeBatchKeyVO keyVO);

    /**
     * 学校绑定预警信息
     * @param vo
     */
    PageInfo<AddressBoundCheckVO> queryBoundLessAsLeafNodes(BasePageVO vo);

    /**
     * 学校绑定预警信息exec导出
     * @param vo
     * @param response
     */
    void downloadBoundWarningInfo(AddressBoundCheckVO vo, HttpServletResponse response);

    /**
     * 地址识别并匹配学区
     * 通过java代码实现
     * @param vo
     * @return
     */
    AddressInfoAndSchool addressParseAndMatchSchool(AddressReqVO vo);

    /**
     * 新地址识别并匹配学区
     * 通过java代码实现
     * @param vo
     * @return
     */
    void addressMatchSchoolAndSave(AddressReqVO vo);

    /**
     * 根据地址匹配的结果返回学区信息
     * @param addressInfo
     * @return
     */
    Map<String, List<EduSchoolVO>> matchSchoolByAddressInfo(AddressInfo addressInfo);

    /**
     * 匹配学区并且保存
     * @param eduAddress
     */
    void matchSchoolAndSave(EduAddress eduAddress);
    /**
     * 地址重新解析到树节点中
     * @param vo
     */
    void addressAfreshParse(EduAddressTreeInitialQueryVO vo);

    /**
     * 用于xxlJob方法调用解析新地址数据
     * @param vo
     */
    void newAddressParse(AddressReqVO vo);

    void saveAddressSchoolAudit(AddressReqVO vo);
}
